﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using System.Collections.ObjectModel;
using System.Globalization;
using produccion.vistamodelo;
using System.Threading;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMadmorddes.xaml
    /// </summary>
    public partial class FRMadmorddes : Window
    {
        public FRMadmorddes()
        {
            InitializeComponent();
        }

        private void butCap_Click(object sender, RoutedEventArgs e)
        {
            if (String.IsNullOrEmpty(texOrd.Text.Trim()) == false)
            {
                admorddes.Instance.capturar();
            }
            else
            {
                MessageBox.Show("Debe existir una orden de despacho","PROCESO CANCELADO",MessageBoxButton.OK,MessageBoxImage.Stop);
            }
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            admorddes.Instance = null;
        }

        private void butGua_Click(object sender, RoutedEventArgs e)
        {
            admorddes.Instance.guardar();
            texOrd.Focus();
            texOrd.Select(0, 0);
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void datOrdOrd_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            //Style MyStyleTransparent = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
            //MyStyleTransparent.Setters.Add(new Setter(BackgroundProperty, Brushes.Transparent));//FJRF - Decimos que el texto se ponga transparente para que tome las propiedades del grid

            //(e.Column as DataGridTextColumn).CellStyle = MyStyleTransparent;//FJRF - Asignamos el estilo creado

            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            if (strNombreColumna != "Orden" )//FJRF - Si alguna de las columnas tiene este nombre hacemos lo siguiente
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";//FJRF - Enviamos el formato a la celda
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;//FJRF - Asignamos el estilo creado
            }
            if (strNombreColumna == "Orden" || strNombreColumna =="Total")
            {
                e.Column.IsReadOnly = true;
            }
        }

        private void butEli_Click(object sender, RoutedEventArgs e)
        {
            admorddes.Instance.eliminar();
            texOrd.Focus();
            texOrd.Select(0, 0);
        }

        private void butNue_Click(object sender, RoutedEventArgs e)
        {
            admorddes.Instance.nuevo();
            admorddes.Instance.dtLotesIngresados.Clear();
            texOrd.Focus();
            texOrd.Select(0, 0);
            Limpiar();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //FJRF - CON ESTO GARANTIZAMOS QUE LAS FECHAS SIEMPRE VENDRAN EN ESTE FORMATO DE DIA/MES/AÑO
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");//FJRF - Con esto aseguramos que la base de datos reciba los numeros como se deben recibir
            Thread.CurrentThread.CurrentCulture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy";

            #region FJRF - EstilosParaDataGrid
            //Style MyStyleTransparent = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
            //MyStyleTransparent.Setters.Add(new Setter(BackgroundProperty, Brushes.Transparent));//FJRF - Decimos que el texto se ponga transparente para que tome las propiedades del grid

            //datToTalla.Columns[0].CellStyle = MyStyleTransparent;
            //datToTalla.Columns[1].CellStyle = MyStyleTransparent;
            //datToTalla.Columns[2].CellStyle = MyStyleTransparent;
            //datToTalla.Columns[3].CellStyle = MyStyleTransparent;

            Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
            MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

            datToTalla.Columns[4].CellStyle = MyStyleTextAlignmentProperty;
            datToTalla.Columns[5].CellStyle = MyStyleTextAlignmentProperty;
            datToTalla.Columns[6].CellStyle = MyStyleTextAlignmentProperty;
            datToTalla.Columns[7].CellStyle = MyStyleTextAlignmentProperty;

            DtgLotesIngresados.Columns[0].CellStyle = MyStyleTextAlignmentProperty;
            #endregion

            Keyboard.Focus(texOrd);
        }

        private void datToTalla_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void datOrdOrd_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

        private void Limpiar()
        {
            try
            {
                admorddes.Instance.visorFotoReferencia.strCodigo = "";
                admorddes.Instance.visorFotoReferencia.strColor = "";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void comCli_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (admorddes.Instance.selcli != null)
            {
                if (admorddes.Instance.selcli.CODCLI_CLI != null)
                {
                    Limpiar();
                    admorddes.Instance.dtLotesIngresados.Clear();

                    if (admorddes.Instance.selOrdDes != null)
                        admorddes.Instance.selOrdDes.ordProDes.Clear();
                }
            }
        }
    }

    
    
    public class admorddes:ObservableObject
    {
        
        #region singleton

        private static admorddes instance = null;

        protected admorddes() 
        {
            MDOgeneral.conectar();
            strTituloVentana = "Administrar ordenes de despacho" + " - Usuario: " + MDOgeneral.usuario + " - [FRMadmorddes]";
        }
        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        public static admorddes Instance
        {
            get
            {
                if (instance == null)
                    instance = new admorddes();
                return instance;
            }
            set 
            { 
                if (instance != null)
                    instance = null;
            }
        }

        #endregion
                
        #region Administrar ordenes de despacho

        private string _strTipoOrden;
        public string strTipoOrden
        {
            get { return _strTipoOrden; }
            set { _strTipoOrden = value; RaisePropertyChangedEvent("strTipoOrden"); }
        }

        private DataTable _dtLotesIngresados = new DataTable();
        public DataTable dtLotesIngresados
        {
            get { return _dtLotesIngresados; }
            set { _dtLotesIngresados = value; RaisePropertyChangedEvent("dtLotesIngresados"); }
        }

        private ObservableCollection<OrdenDespacho> _ordenDespachar = new ObservableCollection<OrdenDespacho>();
        public ObservableCollection<OrdenDespacho> ordenDespachar 
        {
            get { return _ordenDespachar; }
            set { _ordenDespachar = value; RaisePropertyChangedEvent("ordenDespachar"); }        
        }

        private OrdenDespacho _selOrdDes = new OrdenDespacho();
        public OrdenDespacho selOrdDes 
        {
            get { return _selOrdDes;}
            set 
            {                
                if (!ERRORG1)
                    _selOrdDes = value;
                if (_selOrdDes != null)
                {
                    visorFotoReferencia.strCodigo = _selOrdDes.referencia;
                    visorFotoReferencia.strColor = _selOrdDes.color;
                }
                RaisePropertyChangedEvent("selOrdDes");
            }
        }
        
        private MDOgeneral.mensaje _msnadm = new MDOgeneral.mensaje();
        public MDOgeneral.mensaje msnadm
        {
            get { return _msnadm; }
            set { _msnadm = value; RaisePropertyChangedEvent("msnadm"); }
        }

        public class OrdenDespacho:ObservableObject 
        {
            private string _referencia;
            public string referencia
            {
                get { return _referencia; }
                set
                {
                    _referencia = value;
                    consDescripcion();
                    RaisePropertyChangedEvent("referencia");
                }
            }

            private string _descripcion;
            public string descripcion
            {
                get { return _descripcion; }
                set { _descripcion = value; RaisePropertyChangedEvent("descripcion"); }
            }

            private string _color;
            public string color 
            {
                get { return _color; }
                set 
                { 
                    _color = value;
                    consTallas();
                    consNomColor();
                    consPrecio();
                    RaisePropertyChangedEvent("color");
                }
            }

            private string _nomcolor;
            public string nomcolor
            {
                get { return _nomcolor; }
                set { _nomcolor = value; RaisePropertyChangedEvent("nomcolor"); }
            }

            private int _total;
            public int total 
            {
                get { return _total; }
                set 
                { 
                    _total = value;
                    totalxprecio();
                    RaisePropertyChangedEvent("total");
                }
            }

            private double _precio;
            public double precio 
            {
                get { return _precio; }
                set 
                {
                    _precio = value;
                    totalxprecio();
                    RaisePropertyChangedEvent("precio");
                }
            }

            private double _totalp;
            public double totalp
            {
                get { return _totalp; }
                set { _totalp = value; RaisePropertyChangedEvent("totalp"); }
            }

            private DataTable _tallaje=new DataTable();
            public DataTable tallaje 
            {
                get { return _tallaje; }
                set { _tallaje = value; RaisePropertyChangedEvent("tallaje"); }
            }

            private DataTable _ordProDes = new DataTable();
            public DataTable ordProDes 
            {
                get { return _ordProDes; }
                set { _ordProDes = value; RaisePropertyChangedEvent("ordProDes"); }
            }

            public void consTallas() 
            {
                try
                {
                    clases.CLSMAEPRO mae = new clases.CLSMAEPRO { CODREF_PRO = referencia, CODCOL_PRO = color };
                    DataTable valores = mae.BuscarTallas();
                    DataTable val = new DataTable();
                    DataTable vals = new DataTable();
                    vals.Columns.Add("Orden");
                    
                    DataColumn[] columns = new DataColumn[1];
                    columns[0] = vals.Columns["Orden"];
                    vals.PrimaryKey= columns;

                    foreach (DataRow r in valores.Rows)
                    {
                        if (!String.IsNullOrEmpty(r["talla"].ToString()))
                        {
                            val.Columns.Add(r["talla"].ToString(),System.Type.GetType("System.Int32"));
                            vals.Columns.Add(r["talla"].ToString(), System.Type.GetType("System.Int32"));
                        }
                    }
                    vals.Columns.Add("Total");
                    DataRow fila = val.NewRow();
                    val.Rows.Add(fila);
                    ordProDes = vals;
                    tallaje = val;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            public void consDescripcion() 
            {
                try 
                {
                    clases.CLSMAEREF maesref = new clases.CLSMAEREF {CODREF_REF=referencia};
                    maesref.Consultar();
                    descripcion = maesref.NOMREF_REF;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            public void consNomColor() 
            {
                try 
                {
                    clases.CLSMAECOL maescol = new clases.CLSMAECOL { CODCOL_COL = color };
                    maescol.Consultar();
                    nomcolor = maescol.NOMCOL_COL;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            public void totalxprecio() 
            {
                totalp = total * precio;
            }

            public void consPrecio() 
            {
                try 
                {
                    string codlispre = admorddes.Instance.selcli.CODLIS_CLI;
                    if (!String.IsNullOrEmpty(codlispre))
                    {
                        clases.CLSMAETARP maestari = new clases.CLSMAETARP { CODREF_TAR = referencia, CODCOL_TAR = color, CODLIS_TAR = codlispre };
                        maestari.consTarUniRef();
                        precio = maestari.VALOR_TAR;
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
        
        }
        
        private List<clases.CLSMAECLIP> _listaClie = new clases.CLSMAECLIP().listaCliente();
        public List<clases.CLSMAECLIP> listaClie {
            get { return _listaClie; }
            set { _listaClie = value; RaisePropertyChangedEvent("listaClie"); }
        }

        private clases.CLSMAECLIP _selcli = new clases.CLSMAECLIP();
        public clases.CLSMAECLIP selcli {
            get { return _selcli; }
            set { _selcli = value; RaisePropertyChangedEvent("selcli"); }
        }

        private int _selorden;
        public int selorden
        {
            get { return _selorden; }
            set { _selorden = value; RaisePropertyChangedEvent("selorden"); }
        }

        #region propiedades enlazadas al encabezado de la orden de despacho ***

        public string nroorddes
        {
            get { return enc.NROORD_EOD; }
            set
            {
                enc.NROORD_EOD = value;
                visorFotoReferencia.strCodigo = "";
                visorFotoReferencia.strColor = "";
                consultar();
                RaisePropertyChangedEvent("nroorddes");
            }
        }

        private clases.CLSENCORDD _enc = new clases.CLSENCORDD();
        public clases.CLSENCORDD enc
        {
            get { return _enc; }
            set { _enc=value; RaisePropertyChangedEvent("enc"); }
        }

        BitmapImage _imagen;
        public BitmapImage imagen
        {
            get { return _imagen; }
            set { _imagen = value; RaisePropertyChangedEvent("imagen"); }
        }

        private Boolean _ERRORG1=true;
        public Boolean ERRORG1 
        {
            get { return _ERRORG1; }
            set { _ERRORG1 = value; RaisePropertyChangedEvent("ERRORG1"); }
        }

        private Boolean _MODIFIG1 = false;
        public Boolean MODIFIG1
        {
            get { return _MODIFIG1; }
            set { _MODIFIG1 = value; RaisePropertyChangedEvent("MODIFIG1"); }
        }

        #endregion

        public void cargar() 
        {
            try 
            {
                carRefOrdLeida();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void carRefOrdLeida()
        {
            ordenDespachar.Clear();
            List<LecturaOrden> e = OrdenLeida.OrderBy(r => r.referencia + r.color + r.talla).ToList();
            string codigo = "";
            for (int i = 0; i <= e.Count - 1; i++)
            {
                if (!codigo.Equals(e[i].referencia + e[i].color))
                {
                    codigo = e[i].referencia + e[i].color;
                    OrdenDespacho fila = new OrdenDespacho { referencia = e[i].referencia, color = e[i].color };
                    string orden="";
                    DataRow f = fila.ordProDes.NewRow();
                    for (int j = i; j <= e.Count - 1; j++)
                    {
                        if (codigo.Equals(e[j].referencia + e[j].color))
                        {
                            fila.total = fila.total + 1;
                            int can = 0;
                            if (fila.tallaje.Rows[0][e[j].talla] != DBNull.Value)
                            {
                                can = Convert.ToInt32(fila.tallaje.Rows[0][e[j].talla]);
                            }
                            can = can + 1;
                            fila.tallaje.Rows[0][e[j].talla] = can;

                            if (!orden.Equals(e[j].orden)) 
                            {
                                DataRow foundRow = fila.ordProDes.Rows.Find(e[j].orden);

                                if (foundRow == null)
                                {
                                    f = fila.ordProDes.NewRow();
                                    f["Orden"] = e[j].orden;
                                    fila.ordProDes.Rows.Add(f);
                                }
                                else
                                {
                                    f = foundRow;
                                }
                                orden = e[j].orden;
                            }

                            int canord = 0;
                            if (f[e[j].talla] != DBNull.Value)
                            {
                                canord = Convert.ToInt32(f[e[j].talla]);
                            }
                   
                            canord = canord + 1;
                            f[e[j].talla] = canord;

                            int cantot = 0;
                            if (f["Total"] != DBNull.Value)
                            {
                                cantot = Convert.ToInt32(f["Total"]);
                            }
                   
                            cantot = cantot + 1;
                            f["Total"] = cantot;
                        }
                        else
                        {
                            break;
                        }
                    }

                    ordenDespachar.Add(fila);
                }
            }

            if (ordenDespachar.Count == 0)
            {
                ERRORG1 = true;
                MODIFIG1 = false;
            }
            else 
            {
                ERRORG1 = false;
                MODIFIG1 = true;
                selOrdDes = ordenDespachar.First();
            }
        }
        
        public void guardar() 
        {
            String StrDato1;
            try
            {
                clases.CLSENCORDD orddes = enc;
                
                orddes.lisDetOrd.Clear();
                orddes.lisOrdOrd.Clear();

                foreach (OrdenDespacho orden in ordenDespachar)
                {
                    for (int i = 0; i <= orden.tallaje.Columns.Count - 1; i++)
                    {
                        StrDato1 = orden.tallaje.Rows[0][i].ToString();

                        if (!String.IsNullOrEmpty(StrDato1) && orden.tallaje.Rows[0][i] != DBNull.Value)
                        {
                            orddes.lisDetOrd.Add(new clases.CLSDETORDD
                            {
                                NROORD_DOD = nroorddes,
                                CODREF_DOD = orden.referencia,
                                CODCOL_DOD = orden.color,
                                CODTAL_DOR = orden.tallaje.Columns[i].ColumnName,
                                CANPRO_DOD = Convert.ToInt32(orden.tallaje.Rows[0][i]),
                                PREPRO_DOD = Convert.ToInt32(orden.precio)
                            });
                        }
                    }
                    foreach(DataRow ordpro in orden.ordProDes.Rows){
                        for (int j = 1; j <= orden.ordProDes.Columns.Count - 2; j++) {
                            if (!String.IsNullOrEmpty(ordpro[j].ToString()) && ordpro[j] != DBNull.Value)
                            {
                                orddes.lisOrdOrd.Add(new clases.CLSORDORDD 
                                { 
                                    NROORDP_OOD=ordpro[0].ToString(),
                                    NROORDD_OOD=nroorddes,
                                    CODTAL_OOD=orden.ordProDes.Columns[j].ToString(),
                                    CODREF_OOD=orden.referencia,
                                    CODCOL_OOD=orden.color,
                                    CANPRO_OOD = Convert.ToInt32(ordpro[j])
                                });
                            }
                        }
                    }
                }
            
                orddes.ESTADO_EOD = "L";
                if (orddes.guardar(strTipoOrden))
                {
                    msnadm.texto = "Los cambios realizados en la orden de despacho "+ nroorddes +" fueron guardados correctamente.";
                    msnadm.tipo = true;

                    String StrLoteIngresado = "", StrConsulta = "";
                    MDOgeneral MdoGeneral = new MDOgeneral();

                    for (int IntFilaActual = 0; IntFilaActual < dtLotesIngresados.Rows.Count; IntFilaActual++)//FJRF - Recorremos la informacion encontrada
                    {
                        StrLoteIngresado = dtLotesIngresados.Rows[IntFilaActual][0].ToString();//FJRF - Extraemos la informacion que necesitamos
                        StrConsulta = "UPDATE LECTPEND SET ESTADO_LPN = 'C' WHERE LOTE_LPN = '" + StrLoteIngresado + "' AND TIPO_LPN = 'OR' ";//FJRF - Armamos la consulta
                        MdoGeneral.comando(StrConsulta);//FJRF - Ejecutamos la consulta
                    }

                    consultar();

                    PubV_Imprimir(nroorddes);//FJRF - Se imprime
                }
                else
                {
                    msnadm.texto = "Los cambios realizados en la orden de despacho " + nroorddes + " no pueden ser guardados.";
                    msnadm.tipo = true;
                }
            }
            catch (Exception ex)
            { 
                MessageBox.Show(ex.Message); 
            }
        }
        public void PubV_Imprimir(String StrNumeroOrden)
        {
            //FJRF - Creamos las variables que necesitamos para el informe
            string StrComandoDado, StrRutaPlano, StrNombreDocumento, StrRutaImpresionLPT2, StrLineaAEjecutar;

            try
            {
                if (MDOgeneral.strImpresionLPT2 == "" || MDOgeneral.strImpresionLPT2 == null)
                {
                    //PrivV_ImprimirInformeEnCrystalReport();
                    MessageBox.Show("El reporte en cystal aun no se ha creado... estamos trabajando en eso","PROCESO CANCELADO", MessageBoxButton.OK, MessageBoxImage.Stop);
                }
                else
                {
                    EjecutarSp_SP_IMPORDDESP(StrNumeroOrden);//FJRF - Ejecutamos el sp con el numero de la orden

                    StrComandoDado = "COPY";//FJRF - Enviamos el comando que vamos a ejecutar
                    StrRutaPlano = MDOgeneral.strRutaImpresionDocumentos;//FJRF - Cargamos la ruta del archivo plano donde la deja el sp
                    StrNombreDocumento = "LOR" + StrNumeroOrden + ".LOR";//FJRF - Armamos el nombre del documento
                    StrRutaImpresionLPT2 = MDOgeneral.strImpresionLPT2;//FJRF - Enviamos la ruta de impresion -  esto es como decir (@"\\frar01\epson_javier")

                    StrLineaAEjecutar = StrComandoDado + " " + StrRutaPlano + StrNombreDocumento + " " + StrRutaImpresionLPT2;//FJRF - Armamos la linea de comando a ejecutar

                    EjecutarComando(StrLineaAEjecutar);//FJRF - Ejecutamos el comando dado en la linea
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        private void EjecutarSp_SP_IMPORDDESP(string StrCodigoOrden)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                MDOgeneral.spComando.CommandText = "SP_IMPORDDESP";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_nroord", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(StrCodigoOrden) ? "   " : StrCodigoOrden;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
        }
        private void EjecutarComando(string StrComando)//FJRF - Este procedimiento ejecuta un comando en dos (CMD)
        {
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.FileName = "cmd";
            proc.StartInfo.RedirectStandardInput = true;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.UseShellExecute = false;
            proc.Start();
            proc.StandardInput.WriteLine(StrComando);
            proc.StandardInput.Flush();
            proc.StandardInput.Close();
            proc.Close();
        }


        public void consultar() 
        {
            try 
            {             
                enc.consultar();
                conOrdOrd();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message+"5"); }
        }
        
        public void conOrdOrd()
        {
            try
            {
                ordenDespachar.Clear();
                clases.CLSORDORDD ord = new clases.CLSORDORDD { NROORDD_OOD = nroorddes };
                List<clases.CLSORDORDD> lisOrd = ord.consultar();
                string codigo = "";
    
                foreach (clases.CLSORDORDD r in lisOrd)
                {
                    if (!codigo.Equals(r.CODREF_OOD + r.CODCOL_OOD))
                    {
                        codigo = r.CODREF_OOD + r.CODCOL_OOD;
                        OrdenDespacho obj = new OrdenDespacho();
                        obj.referencia = r.CODREF_OOD;
                        obj.color = r.CODCOL_OOD;

                        if (obj.tallaje.Rows[0][r.CODTAL_OOD] == DBNull.Value)
                        {
                            obj.tallaje.Rows[0][r.CODTAL_OOD] = r.CANPRO_OOD;
                        }
                        else 
                        {
                            obj.tallaje.Rows[0][r.CODTAL_OOD] = Convert.ToInt32(obj.tallaje.Rows[0][r.CODTAL_OOD]) + r.CANPRO_OOD;
                        }

                        ordenDespachar.Add(obj);
                        ordenDespachar.Last().total = r.CANPRO_OOD;
                    }
                    else 
                    {
                        if (ordenDespachar.Last().tallaje.Rows[0][r.CODTAL_OOD] == DBNull.Value)
                        {
                            ordenDespachar.Last().tallaje.Rows[0][r.CODTAL_OOD] = r.CANPRO_OOD;
                        }
                        else
                        {
                            ordenDespachar.Last().tallaje.Rows[0][r.CODTAL_OOD] = Convert.ToInt32(ordenDespachar.Last().tallaje.Rows[0][r.CODTAL_OOD]) + r.CANPRO_OOD;
                        }
                        ordenDespachar.Last().total = ordenDespachar.Last().total+ r.CANPRO_OOD;
                    }

                    DataRow foundRow = ordenDespachar.Last().ordProDes.Rows.Find(r.NROORDP_OOD);
                    if (foundRow == null)
                    {
                        foundRow = ordenDespachar.Last().ordProDes.NewRow();
                        foundRow["Orden"] = r.NROORDP_OOD;
                        ordenDespachar.Last().ordProDes.Rows.Add(foundRow);
                    }

                    foundRow[r.CODTAL_OOD] = r.CANPRO_OOD;

                    if (foundRow["Total"] == DBNull.Value)
                    {
                        foundRow["Total"] = r.CANPRO_OOD;
                    }
                    else 
                    {
                        foundRow["Total"] = Convert.ToUInt32(foundRow["Total"]) + r.CANPRO_OOD;
                    }
                }
                if (ordenDespachar.Count == 0)
                {
                    ERRORG1 = true;
                    MODIFIG1 = false;
                }
                else
                {
                    ERRORG1 = false;
                    MODIFIG1 = false;
                    selOrdDes = ordenDespachar.First();
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message+"f"); }
        }

        public void eliminar() 
        {
            try 
            {
                enc.ESTADO_EOD = "X";
                if (enc.eliminar() > 0)
                {
                    msnadm.texto = "La orden de despacho " + enc.NROORD_EOD + " se ha marcado como eliminada.";
                    msnadm.tipo = true;
                    consultar();
                }
                else 
                {
                    msnadm.texto = "La orden de despacho " + enc.NROORD_EOD + " no puede ser marcada como eliminada.";
                    msnadm.tipo = false;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void nuevo() 
        {
            try 
            {
                nroorddes= enc.nuevo();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        
        #endregion

        #region Captura de Datos
                    
        private ObservableCollection<LecturaOrden> _OrdenLeida=new ObservableCollection<LecturaOrden>();
        public ObservableCollection<LecturaOrden> OrdenLeida {
            get { return _OrdenLeida; }
            set { _OrdenLeida = value; RaisePropertyChangedEvent("OrdenLeida"); }
        }
       
        public class LecturaOrden : ObservableObject
        {

            private string _orden;
            public string orden
            {
                get { return _orden; }
                set { _orden = value; RaisePropertyChangedEvent("orden"); }
            }

            private string _referencia;
            public string referencia
            {
                get { return _referencia; }
                set { _referencia = value; RaisePropertyChangedEvent("referencia"); }
            }

            private string _color;
            public string color
            {
                get { return _color; }
                set { _color = value; RaisePropertyChangedEvent("color"); }
            }

            private string _talla;
            public string talla
            {
                get { return _talla; }
                set { _talla = value; RaisePropertyChangedEvent("talla");  }
            }
        }

        private string _lectura="";
        public string lectura 
        {
            get { return _lectura; }
            set 
            {
                _lectura = value;
                if (_lectura != null)
                {
                    if (_lectura.Length > 5)
                    {
                        agregarLec();
                    }
                }
                RaisePropertyChangedEvent("lectura");
            }
        }

        private int _total = 0;
        public int total 
        {
            get { return _total; }
            set {   _total = value; RaisePropertyChangedEvent("total"); }
        }
        
        private MDOgeneral.mensaje _msn = new MDOgeneral.mensaje ();
        public MDOgeneral.mensaje msn 
        {
            get { return _msn; }
            set { _msn = value; RaisePropertyChangedEvent("msn"); }
        }


        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; RaisePropertyChangedEvent("visorFotoReferencia"); }
        }

        public void capturar()
        {
            try
            {
                FRMLectMat frm = new FRMLectMat();
                admorddes.instance.OrdenLeida.Clear();
                admorddes.instance.visorFotoReferencia.strCodigo = "";
                admorddes.instance.visorFotoReferencia.strColor = "";

                if (admorddes.instance.selcli != null)
                    frm.StrClienteQueLlega = admorddes.instance.selcli.CODCLI_CLI;
                frm.ShowDialog();

                RaisePropertyChangedEvent("dtLotesIngresados");
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void agregarLecAgregar(String StrOrden, String StrReferencia, String StrColor, String StrTalla)
        {
            try
            {
                clases.CLSDETORDP deordp = new clases.CLSDETORDP { NROORD_DOP = StrOrden, CODREF_DOP = StrReferencia, CODCOL_DOP = StrColor, CODTAL_DOP = StrTalla };
                if (deordp.existe())
                {
                    int cantLeida = OrdenLeida.ToList().FindAll(r => r.orden.Equals(StrOrden) &
                        r.referencia.Equals(StrReferencia) & r.color.Equals(StrColor) & r.talla.Equals(StrTalla)).Count;

                    int cantOrd = deordp.consCant();

                    if (cantLeida + 1 <= cantOrd)
                    {
                        OrdenLeida.Add(new LecturaOrden
                        {
                            orden = StrOrden,
                            referencia = StrReferencia,
                            color = StrColor,
                            talla = StrTalla
                        });
                        msn.texto = "El producto " + _lectura + " fue leido correctamente.";
                        msn.tipo = true;
                    }
                    else
                    {
                        msn.texto = "La cantidad de productos " + _lectura + " supera la ordenada.";
                        msn.tipo = false;
                    }
                }
                else
                {
                    msn.texto = "El producto " + _lectura + " no existe en el sistema.";
                    msn.tipo = false;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public Double PubDbl_Precio(String StrReferencia, String StrColor)
        {
            Double DblPrecio = 0;
            string codlispre = admorddes.Instance.selcli.CODLIS_CLI;
            if (!String.IsNullOrEmpty(codlispre))
            {
                clases.CLSMAETARP maestari = new clases.CLSMAETARP { CODREF_TAR = StrReferencia, CODCOL_TAR = StrColor, CODLIS_TAR = codlispre };
                maestari.consTarUniRef();
                DblPrecio = maestari.VALOR_TAR;
            }
            return DblPrecio;
        }
        public void agregarLec()
        {
            String StrDatosMalos = "";//FJRF - Guardamos los datos malos en una variable
            int IntContadorReferenciasMalas = 0;//FJRF - Para saber cuantas referencias malas existen

            try
            {
                if (_lectura.Length == 16 || _lectura.Length == 19)//FJRF - Validamos para que entre si se ha capturado un codigo de 16 o de 19 digitos
                {
                    string orden = "", codBarras = "";//FJRF - Creamos las variables con las que trabajaremos y las inicializamos sin datos

                    orden = _lectura.Substring(0, 6);//FJRF - Extraemos el numero de la orden

                    if (_lectura.Length == 16)//FJRF - Si el codigo llega de 16 entonces hacemos lo siguiente
                    {
                        codBarras = "770" + _lectura.Substring(6);//FJRF - Le agregamos el 770 y quitamos el numero de la orden
                    }
                    else//FJRF - Si el codigo leido llega de 19 entonces hacemos lo siguiente (Porque ya se valido que solo entre si es de 16 o 19)
                    {
                        codBarras = _lectura.Substring(6);//FJRF - quitamos el numero de la orden porque ya viene con el 770
                    }

                    clases.CLSENCORDP ord = new clases.CLSENCORDP { NROORD_EOP = orden };
                    ord.consultar();
                    if (ord.CODCLI_EOP != null)
                    {
                        if (ord.CODCLI_EOP == selcli.CODCLI_CLI)
                        {
                            clases.CLSMAEPRO mp = new clases.CLSMAEPRO { CODBAR_PRO = codBarras };
                            mp.consultarCodBarras();

                            if (mp.CODREF_PRO != null)
                            {
                                string referencia = mp.CODREF_PRO;
                                string color = mp.CODCOL_PRO;
                                string talla = mp.CODTAL_PRO;

                                if (admorddes.Instance.PubDbl_Precio(referencia, color) == 0)//FJRF - Si la referencia no tiene un precio hacemos lo siguiente
                                {
                                    IntContadorReferenciasMalas++;//FJRF - Contamos los registros malos
                                    StrDatosMalos = StrDatosMalos + "El producto " + _lectura + " de referencia [ " + referencia + " ] en color [ " + color + " ] " + " tiene el precio en cero";//FJRF - Armamos el mensaje

                                    msn.texto = StrDatosMalos;//FJRF - Enviamos la informacion
                                    msn.tipo = false;
                                }
                                else//FJRF - Si tiene precio hacemo lo siguiente
                                {
                                    clases.CLSDETORDP deordp = new clases.CLSDETORDP { NROORD_DOP = orden, CODREF_DOP = referencia, CODCOL_DOP = color, CODTAL_DOP = talla };
                                    if (deordp.existe())
                                    {
                                        int cantLeida = OrdenLeida.ToList().FindAll(r => r.orden.Equals(orden) &
                                            r.referencia.Equals(referencia) & r.color.Equals(color) & r.talla.Equals(talla)).Count;

                                        int cantOrd = deordp.consCant();

                                        if (cantLeida + 1 <= cantOrd)
                                        {
                                            OrdenLeida.Add(new LecturaOrden
                                            {
                                                orden = orden,
                                                referencia = referencia,
                                                color = color,
                                                talla = talla
                                            });
                                            msn.texto = "El producto " + _lectura + " fue leido correctamente.";
                                            msn.tipo = true;
                                        }
                                        else
                                        {
                                            msn.texto = "La cantidad de productos " + _lectura + " supera la ordenada.";
                                            msn.tipo = false;
                                        }
                                    }
                                    else
                                    {
                                        msn.texto = "El producto " + _lectura + " no existe en el sistema.";
                                        msn.tipo = false;
                                    }
                                }
                            }
                            total = OrdenLeida.Count;
                        }
                        else
                        {
                            msn.texto = "Este número de orden no pertenece al cliente seleccionado..";
                            msn.tipo = false;
                        }
                    }
                    else
                    {
                        msn.texto = "Número de orden no existe en el sistema.";
                        msn.tipo = false;
                    }
                }
                else
                {
                    msn.texto = "Código de barras incorrecto. ";
                    msn.tipo = false;
                }
                lectura = "";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        
        #endregion
    }
}

namespace ReglasValidacion
{
    public class esOKordProDes : ValidationRule
    {       
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            produccion.forms.admorddes model=produccion.forms.admorddes.Instance;
                
            //validar
            for (int j = 1; j <= model.selOrdDes.ordProDes.Columns.Count - 2; j++)
            {
                string referencia = model.selOrdDes.referencia;
                string color = model.selOrdDes.color;
                string orden = model.selOrdDes.ordProDes.Rows[model.selorden][0].ToString();
                string talla = model.selOrdDes.ordProDes.Columns[j].ToString();
                int cantLeida = 0;
                if (!String.IsNullOrEmpty(model.selOrdDes.ordProDes.Rows[model.selorden][j].ToString()) && model.selOrdDes.ordProDes.Rows[model.selorden][j]!=DBNull.Value)
                {
                    cantLeida = Convert.ToInt32(model.selOrdDes.ordProDes.Rows[model.selorden][j]);
                }                
                if (cantLeida>0)
                {
                    produccion.clases.CLSDETORDP deordp = new produccion.clases.CLSDETORDP { NROORD_DOP = orden, CODREF_DOP = referencia, CODCOL_DOP = color, CODTAL_DOP = talla };
                    if (deordp.existe())
                    {
                        int cantOrd = deordp.consCant();
                       
                        if (cantLeida > cantOrd) 
                        {
                            model.ERRORG1 = true;
                            return new ValidationResult(false,"La cantidad ingresada es mayor que la cantidad ordenada para la talla. "+talla);
                        }
                    }
                    else 
                    {
                        model.ERRORG1 = true;
                        return new ValidationResult(false, "En la orden de produccion no se ha programado la talla. "+talla+".");                                    
                    }
                }
            }
            //sumar
            int total=0;
            for (int i = 1; i <= model.selOrdDes.ordProDes.Columns.Count - 2; i++)
            {
                int val = 0;
                foreach (DataRow ordenDes in model.selOrdDes.ordProDes.Rows)
                {
                    if (!String.IsNullOrEmpty(ordenDes[i].ToString()) && ordenDes[i] != DBNull.Value)
                    {
                        val = val + Convert.ToInt32(ordenDes[model.selOrdDes.ordProDes.Columns[i].ToString()]);
                    }
                }
                model.selOrdDes.tallaje.Rows[0][model.selOrdDes.ordProDes.Columns[i].ToString()] = val;
                total = total + val;
            }
            model.selOrdDes.total=total;
           
            foreach (DataRow dr in model.selOrdDes.ordProDes.Rows) {
                int acum = 0;
                for (int col = 1; col <= model.selOrdDes.ordProDes.Columns.Count - 2; col++) 
                {
                    if (!String.IsNullOrEmpty(dr[col].ToString()) && dr[col] != DBNull.Value)
                    {
                        acum = acum + Convert.ToInt32(dr[col]);
                    }            
                }
                dr["Total"] = acum;
            }
            model.ERRORG1 = false;
            model.MODIFIG1 = true;
            return new ValidationResult(true, null);
        }
    }

    public class esOKnumOrdDes : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            produccion.forms.admorddes model = produccion.forms.admorddes.Instance;

            if (model.enc.NROORD_EOD == null) 
            {
                return new ValidationResult(false, "La orden no existe.");
            }

            produccion.clases.CLSENCORDD encord = new produccion.clases.CLSENCORDD { NROORD_EOD = model.enc.NROORD_EOD };
            if (encord.existe()||encord.nuevo().Equals(model.enc.NROORD_EOD)) 
            {
                return new ValidationResult(true, null);
            } 
            else 
            {
                return new ValidationResult(false, "La orden que ha ingrasado no existe.");
            }
        }
    }
}


namespace ReglasFormato
{
    //Estado orden de despacho
    [ValueConversion(typeof(String), typeof(String))]
    public class EstOrdDes : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            produccion.forms.admorddes model = produccion.forms.admorddes.Instance;

            if (model.enc.ESTADO_EOD != null)
            {
                string dato=model.enc.ESTADO_EOD ;
                switch (dato) 
                { 
                    case "X":
                        return "Eliminado";
                    case "P":
                        return "Nuevo";
                    default:
                        return "Estado L";
                }
            }
            return DependencyProperty.UnsetValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            produccion.forms.admorddes model = produccion.forms.admorddes.Instance;
            if (model.enc.ESTADO_EOD != null)
            {
                return model.enc.ESTADO_EOD;
            }
            return DependencyProperty.UnsetValue;
        }
    }
}